package org.wtframework.website.server.service;


import java.util.Date;
import java.util.List;

import org.openredhead.springx.core.server.page.IPage;
import org.openredhead.springx.core.server.service.Securitys;
import org.openredhead.springx.core.web.mvc.ajaxrpc.BasicAjaxRpcRemoteService;
import org.openredhead.springx.core.web.mvc.annotation.AjaxRpcMethod;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.wtframework.platform.server.manager.impl.UserManager;
import org.wtframework.platform.server.model.impl.User;
import org.wtframework.website.server.manager.InternalEmailManager;
import org.wtframework.website.server.manager.LinkManManager;
import org.wtframework.website.server.model.impl.InternalEmail;
import org.wtframework.website.server.model.impl.LinkMan;

import com.google.common.base.Strings;
import com.google.common.collect.Lists;

/**
 * 
 * <B>类描述：</B> 内部邮件 <br/><br/>
 * <B>作者：</B> 彭海明 <br/><br/>
 * <B>创建日期：</B> 2016年10月29日 上午11:27:43 
 *
 */
@Service
public class InternalEmailService extends BasicAjaxRpcRemoteService {
	
	@Autowired
	private InternalEmailManager internalEmailManager;


	@Autowired
	private LinkManManager linkManManager;
	
	@Autowired
	private UserManager userManager;
	/**
	 * 
	 * <B>方法描述：</B>查询所有的邮件 <br/>
	 *
	 * <B>作者：	 </B> 彭海明<br/>
	 * <B>创建日期：</B> 2016年10月31日 上午11:13:36
	 * @param title
	 * @param pageNo
	 * @param pageSize
	 * @return
	 */
	@AjaxRpcMethod
	public IPage<InternalEmail> findInternalEmail(String title,Integer pageNo, Integer pageSize){
		User userer= Securitys.getAuthenticationUser().getUser();
		List<Object> condition = Lists.newArrayList();
		String hql="from InternalEmail where isDelete=0 ";
		if(!Strings.isNullOrEmpty(title)){
			hql += " and title like ? ";
			condition.add("%"+title+"%");
		}
		hql +=" and publisher=? order by issueStatus desc, submiTime desc";
		condition.add(userer.getNickname());
		return internalEmailManager.findByQuery(hql,condition.toArray()).getPageByPageNo(pageNo, pageSize);
	}
	
	/**
	 * 
	 * <B>方法描述：</B>查询邮件 <br/>
	 *
	 * <B>作者：	 </B> 彭海明<br/>
	 * <B>创建日期：</B> 2016年11月3日 上午11:54:36
	 * @param pageNo
	 * @param pageSize
	 * @return
	 */
	@SuppressWarnings("unchecked")
	@AjaxRpcMethod
	public IPage<InternalEmail> findEmail(Integer pageNo, Integer pageSize){
		
		User userer= Securitys.getAuthenticationUser().getUser();
		String addressee = Long.toString(userer.getId());

		List<InternalEmail> idList = Lists.newArrayList();
		String hql1 = "from InternalEmail";
		List<InternalEmail> addresseeList = internalEmailManager.findByQuery(hql1).getList();
	
		for(int i=0;i<addresseeList.size();i++){
			String [] linkManList1= addresseeList.get(i).getAddressee().split(",");
	        for (int j = 0; j < linkManList1.length; j++) {	  
	        
	        	if(addressee.equals(linkManList1[j])){
	        		if(addresseeList.get(i).getDeleteId()==null||addresseeList.get(i).getDeleteId()==""){
	        			List<InternalEmail> idList1 = internalEmailManager.getQuery("select id from InternalEmail where addressee= ?", addresseeList.get(i).getAddressee()).list();
       				 	idList.addAll(idList1);
	    			}else{
	    				//如果删除人id列表不为空
	    				String [] deleteList= addresseeList.get(i).getDeleteId().split(",");
	    				for (int k = 0; k < deleteList.length; k++) {	
	    					if(addressee.equals(deleteList[k])){
	    					}else{
	    						List<InternalEmail> idList1 = internalEmailManager.getQuery("select id from InternalEmail where addressee= ?", addresseeList.get(i).getAddressee()).list();
	    						idList.addAll(idList1);
	    					}
	    				}
	    			}
	        	}
	        }
		}
		
		if(idList.size()==0){
			String hql="from InternalEmail where 1=2 ";
			return internalEmailManager.findByQuery(hql).getPageByPageNo(pageNo, pageSize);
		}else{
			String hql="from InternalEmail where issueStatus = 1 and id in (:idList) order by orderId desc ";
			return internalEmailManager.findByQuery(hql, "idList",idList).getPageByPageNo(pageNo, pageSize);						
		}
	}
	
	/**
	 * 
	 * <B>方法描述：</B>查询未读邮件 <br/>
	 *
	 * <B>作者：	 </B> 彭海明<br/>
	 * <B>创建日期：</B> 2016年11月4日 上午10:05:19
	 * @param pageNo
	 * @param pageSize
	 * @return
	 */
	@SuppressWarnings("unchecked")
	@AjaxRpcMethod
	public Integer findNoReadEmail(){
		
		User userer= Securitys.getAuthenticationUser().getUser();
		String addressee = Long.toString(userer.getId());

		List<InternalEmail> idList = Lists.newArrayList();
		List<InternalEmail> readList = Lists.newArrayList();
		String hql1 = "from InternalEmail";
		List<InternalEmail> addresseeList = internalEmailManager.findByQuery(hql1).getList();
	
		for(int i=0;i<addresseeList.size();i++){
			String [] linkManList1= addresseeList.get(i).getAddressee().split(",");
	        for (int j = 0; j < linkManList1.length; j++) {	  
	        
	        	if(addressee.equals(linkManList1[j])){
	        	
	        		List<InternalEmail> idList1 = internalEmailManager.getQuery("select id from InternalEmail where addressee= ?", addresseeList.get(i).getAddressee()).list();
	        		idList.addAll(idList1);
	        	}
	        }
	        if(addresseeList.get(i).getReadId()!=null){
	        	
	        	String [] linkManList2= addresseeList.get(i).getReadId().split(",");
	        	for (int j = 0; j < linkManList2.length; j++) {	  
	        		
	        		if(addressee.equals(linkManList2[j])){
	        			
	        			List<InternalEmail> idList2 = internalEmailManager.getQuery("select id from InternalEmail where readId= ?", addresseeList.get(i).getReadId()).list();
	        			readList.addAll(idList2);
	        		}
	        	}
	        }
		}
	
		if(idList.size()==0){
			return 0;
		}else{
			String hql="from InternalEmail where issueStatus = 1 and id in (:idList) order by orderId desc ";
			List<InternalEmail> allList = internalEmailManager.findByQuery(hql, "idList",idList).getList();
			if(readList.size()==0){
				return allList.size();
			}else{
				List<InternalEmail> isReadList = internalEmailManager.findByQuery(hql, "idList",readList).getList();
				return allList.size()-isReadList.size();
			}
		
		}
		
		
	}
	
	/**
	 * 
	 * <B>方法描述：</B>查询联系人 <br/>
	 *
	 * <B>作者：	 </B> 彭海明<br/>
	 * <B>创建日期：</B> 2016年10月31日 下午2:48:23
	 * @param pageNo
	 * @param pageSize
	 * @return
	 */
	@AjaxRpcMethod
	public IPage<LinkMan> findLinkMan(Integer pageNo, Integer pageSize){
		
		User userer= Securitys.getAuthenticationUser().getUser();		
		
		String hql="from LinkMan where userId=? order by orderId desc";
		
		return linkManManager.findByQuery(hql,userer.getId()).getPageByPageNo(pageNo, pageSize);
	}
	
	/**
	 * 
	 * <B>方法描述：</B>通过收件人id查询联系人 <br/>
	 *
	 * <B>作者：	 </B> 彭海明<br/>
	 * <B>创建日期：</B> 2016年11月4日 下午4:07:58
	 * @param Addressee
	 * @return
	 */
	@AjaxRpcMethod
	public IPage<LinkMan> findLinkManByAddressee(String Addressee){
		
		String [] linkManList1= Addressee.split(",");
		Long[] linkManList2 = new Long[linkManList1.length];
        for (int i = 0; i < linkManList1.length; i++) {
        	linkManList2[i] = Long.valueOf(linkManList1[i]);
        }
		
		String hql="from LinkMan where linkManId in (:linkManList) ";
		
		return linkManManager.findByQuery(hql,"linkManList",linkManList2).getPage();
	}
	
	@AjaxRpcMethod
	public IPage<User> findLinkManById(Integer id){
		InternalEmail internalEmail = internalEmailManager.load(id);
		String [] linkManList1= internalEmail.getAddressee().split(",");
		Long[] linkManList2 = new Long[linkManList1.length];
        for (int i = 0; i < linkManList1.length; i++) {
        	linkManList2[i] = Long.valueOf(linkManList1[i]);
        }
		
		String hql="from User where id in (:linkManList) ";
		
		
		return  userManager.findByQuery(hql,"linkManList",linkManList2).getPage();
	}
	
	@AjaxRpcMethod
	public String findLinkManNameById(Integer id){
		InternalEmail internalEmail = internalEmailManager.load(id);
		String [] linkManList1= internalEmail.getAddressee().split(",");
		Long[] linkManList2 = new Long[linkManList1.length];
        for (int i = 0; i < linkManList1.length; i++) {
        	linkManList2[i] = Long.valueOf(linkManList1[i]);
        }
        String hql="select nickname from User where id in (:linkManList) ";
		List<Object> uList = (List<Object>)userManager.getQuery(hql,"linkManList",linkManList2).list();
		String nameStrs="";
		for(Object object : uList){
			nameStrs+=object.toString()+",";
		}
		if(!Strings.isNullOrEmpty(nameStrs)){
			nameStrs = nameStrs.substring(0,nameStrs.length()-1);
		}
		return nameStrs;
	}
	/**
	 * 
	 * <B>方法描述：</B>通过用户id查询联系人 <br/>
	 *
	 * <B>作者：	 </B> 彭海明<br/>
	 * <B>创建日期：</B> 2016年11月4日 下午4:08:58
	 * @return
	 */
	@AjaxRpcMethod
	public List<LinkMan> findLinkManByUserId(){
		
		User userer= Securitys.getAuthenticationUser().getUser();
		
		String hql="from LinkMan where userId=? order by orderId desc";
		
		return linkManManager.findByQuery(hql,userer.getId()).getList();
	}
	
	@AjaxRpcMethod
	public List<User> findUserByUserName(String name){
		
		List<User> userList = userManager.findByQuery("from User where username=?", name).getList();
		return userList;
		
	}
	
	/**
	 * 
	 * <B>方法描述：</B>添加联系人 <br/>
	 *
	 * <B>作者：	 </B> 彭海明<br/>
	 * <B>创建日期：</B> 2016年10月31日 下午3:45:50
	 * @param linkMan
	 */
	@AjaxRpcMethod
	public void linkManAdd(LinkMan linkMan) {

		if (linkManManager.find("linkName", linkMan.getLinkName()).getCount() > 0) {
			throw new RuntimeException("该联系人已存在!");
		} else {
			
			linkManManager.save(linkMan);
		}

	}
	
	/**
	 * 
	 * <B>方法描述：</B>删除联系人 <br/>
	 *
	 * <B>作者：	 </B> 彭海明<br/>
	 * <B>创建日期：</B> 2016年11月4日 上午10:19:25
	 * @param userId
	 * @param linkManId
	 */
	@AjaxRpcMethod
	public void linkManDelete(Long userId ,Long linkManId){
		
		String hql = "delete from LinkMan where userId=? and linkManId=?";
		linkManManager.getQuery(hql, userId,linkManId).executeUpdate();
	}
	/**
	 * 
	 * <B>方法描述：</B>添加邮件 <br/>
	 *
	 * <B>作者：	 </B> 彭海明<br/>
	 * <B>创建日期：</B> 2016年11月2日 上午11:15:55
	 * @param internalEmail
	 */
	@AjaxRpcMethod
	public void addEmail(InternalEmail internalEmail){
		Date date=new Date();
		//设置提交时间为当前时间
		internalEmail.setSubmiTime(date);	
		internalEmailManager.save(internalEmail);
	}
	/**
	 * 
	 * <B>方法描述：</B>（删除邮件） <br/>
	 *
	 * <B>作者：	 </B> 彭海明<br/>
	 * <B>创建日期：</B> 2016年11月2日 上午11:16:16
	 * @param idList
	 */
	@AjaxRpcMethod
	public void deleteEmail(List<Integer> idList){

		for(Integer id : idList){
			InternalEmail internalEmail = internalEmailManager.load(id);
			if(internalEmail!=null){
				if(internalEmail.getIssueStatus()==0){
					internalEmailManager.delete(internalEmail);
				}else if(internalEmail.getIssueStatus()==1){
					internalEmail.setIsDelete(1);
					internalEmailManager.save(internalEmail);
				}
			}
		}
	}
	
	/**
	 * 
	 * <B>方法描述：</B>用户单方面删除邮件 <br/>
	 *
	 * <B>作者：	 </B> 彭海明<br/>
	 * <B>创建日期：</B> 2016年11月21日 上午9:53:16
	 * @param id
	 * @param userId
	 */
	@AjaxRpcMethod
	public void emailDelete(Integer id,String userId){
		
		InternalEmail internalEmail = internalEmailManager.load(id);
		String deleteId = internalEmail.getDeleteId();
		if(deleteId==null||deleteId==""){
			deleteId = userId+",";
		}else{
			deleteId = deleteId+userId+",";
		}
		internalEmail.setDeleteId(deleteId);
		internalEmailManager.save(internalEmail);
		
	}
	
	/**
	 * 
	 * <B>方法描述：</B>发送邮件 <br/>
	 *
	 * <B>作者：	 </B> 彭海明<br/>
	 * <B>创建日期：</B> 2016年11月2日 上午11:20:18
	 * @param id
	 */
		@AjaxRpcMethod
		public void issueNotice(Integer id){
			Date date=new Date();
			InternalEmail internalEmail = internalEmailManager.load(id);
			internalEmail.setIssueStatus(1);
			internalEmail.setPusTime(date);
		}	
		
		/**
		 * 
		 * <B>方法描述：</B>修改邮件 <br/>
		 *
		 * <B>作者：	 </B> 彭海明<br/>
		 * <B>创建日期：</B> 2016年11月2日 下午2:49:10
		 * @param noticeBoard
		 */
		@AjaxRpcMethod
		public void updateEmail(InternalEmail internalEmail){
			InternalEmail interEmail=internalEmailManager.load(internalEmail.getId());
			interEmail.setContent(internalEmail.getContent());
			interEmail.setTitle(internalEmail.getTitle());
			interEmail.setPublisher(internalEmail.getPublisher());
			//设置提交时间为当前时间
			interEmail.setSubmiTime(new Date());
			interEmail.setAddressee(internalEmail.getAddressee());
			

			internalEmailManager.save(interEmail);
		}		
	
		/**
		 * 
		 * <B>方法描述：</B>修改邮件为已读<br/>
		 *
		 * <B>作者：	 </B> 彭海明<br/>
		 * <B>创建日期：</B> 2016年11月4日 上午10:23:01
		 * @param isRead
		 */
		@AjaxRpcMethod
		public void isOrNoRead(Integer id,String userId){
			InternalEmail interEmail=internalEmailManager.load(id);
			String readId;
			if(interEmail.getReadId()==null){
				 readId = userId+",";
			}else{
				 readId = interEmail.getReadId()+userId+",";
			}
			interEmail.setReadId(readId);
			internalEmailManager.save(interEmail);
		}
		
		/**
		 * 
		 * <B>方法描述：</B>撤回已发送的邮件 <br/>
		 *
		 * <B>作者：	 </B> 彭海明<br/>
		 * <B>创建日期：</B> 2016年11月4日 下午2:26:53
		 */
		@AjaxRpcMethod
		public Integer abolishEmail(Integer id){
			InternalEmail interEmail=internalEmailManager.load(id);
			interEmail.setReadId(null);
			interEmail.setDeleteId(null);
			interEmail.setPusTime(null);
			internalEmailManager.save(interEmail);
			String hql = "update from InternalEmail set issueStatus = 0 where id = ?";
			internalEmailManager.getQuery(hql, id).executeUpdate();
			return interEmail.getIssueStatus();
		}
		
		/**
		 * 
		 * <B>方法描述：</B>判断当前邮件是否已读 <br/>
		 *
		 * <B>作者：	 </B> 彭海明<br/>
		 * <B>创建日期：</B> 2016年11月4日 下午3:47:55
		 * @param id
		 * @return
		 */
		@AjaxRpcMethod
		public String isReadById(Integer id){
			
			User userer= Securitys.getAuthenticationUser().getUser();
			String addressee = Long.toString(userer.getId());
			String isRead = "未读";
			InternalEmail interEmail=internalEmailManager.load(id);
			if(interEmail.getReadId()!=null){
				String [] linkManList1= interEmail.getReadId().split(",");
				for (int j = 0; j < linkManList1.length; j++) {	  
					if(addressee.equals(linkManList1[j])){
						isRead = "已读";
					}
				}
			}
			return isRead;
		}
		
}
